dhcpv4: some minor cleanups post-iovec
authorDavid Härdeman <[email protected]>
Mon, 6 Oct 2025 14:45:38 +0000 (16:45 +0200)
committerÁlvaro Fernández Rojas <[email protected]>
Tue, 21 Oct 2025 17:05:28 +0000 (19:05 +0200)
Do some cleanups, remove some magic numbers, make sure structs are defined with
the members in their actual order and without missing members.

Signed-off-by: David Härdeman <[email protected]>
Link: https://github.com/openwrt/odhcpd/pull/278
Signed-off-by: Álvaro Fernández Rojas <[email protected]>
src/dhcpv4.c

index 70b36be8c061f6a770f674aa35fe7dafec5fdae5..8d127e060b0d4abf8de99c3623f013f5d2c59205 100644 (file)
@@ -161,6 +161,7 @@ static void dhcpv4_fr_send(struct dhcp_assignment *a)
                .htype = ARPHRD_ETHER,
                .hlen = ETH_ALEN,
                .hops = 0,
+               .xid = 0,
                .secs = 0,
                .flags = 0,
                .ciaddr = { INADDR_ANY },
@@ -664,15 +665,19 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len,
        /* Reply variables */
        struct dhcpv4_message reply = {
                .op = DHCPV4_OP_BOOTREPLY,
-               .htype = req->htype,
-               .hlen = req->hlen,
+               .htype = ARPHRD_ETHER,
+               .hlen = ETH_ALEN,
                .hops = 0,
                .xid = req->xid,
                .secs = 0,
                .flags = req->flags,
                .ciaddr = { INADDR_ANY },
-               .giaddr = req->giaddr,
+               .yiaddr = { INADDR_ANY },
                .siaddr = iface->dhcpv4_local,
+               .giaddr = req->giaddr,
+               .chaddr = { 0 },
+               .sname = { 0 },
+               .file = { 0 },
                .cookie = htonl(DHCPV4_MAGIC_COOKIE),
        };
        struct dhcpv4_option_u8 reply_msg = {
@@ -788,7 +793,9 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len,
        /* FIXME: would checking the magic cookie value here break any clients? */
 
        if (len < offsetof(struct dhcpv4_message, options) ||
-           req->op != DHCPV4_OP_BOOTREQUEST || req->hlen != ETH_ALEN)
+           req->op != DHCPV4_OP_BOOTREQUEST ||
+           req->htype != ARPHRD_ETHER ||
+           req->hlen != ETH_ALEN)
                return;
 
        debug("Got DHCPv4 request on %s", iface->name);
@@ -798,8 +805,6 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len,
                return;
        }
 
-       memcpy(reply.chaddr, req->chaddr, sizeof(reply.chaddr));
-
        struct dhcpv4_option *opt;
        dhcpv4_for_each_option(req->options, (uint8_t *)data + len, opt) {
                switch (opt->code) {
@@ -855,6 +860,8 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len,
        }
 
        switch (req_msg) {
+       case DHCPV4_MSG_INFORM:
+               break;
        case DHCPV4_MSG_DISCOVER:
                _fallthrough;
        case DHCPV4_MSG_REQUEST:
@@ -866,8 +873,6 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len,
                                 &req_leasetime, req_hostname, req_hostname_len,
                                 req_accept_fr, &incl_fr_opt, &fr_serverid);
                break;
-       case DHCPV4_MSG_INFORM:
-               break;
        default:
                return;
        }
@@ -909,8 +914,8 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len,
                                reply_serverid.data = fr_serverid;
 
                        if (req->ciaddr.s_addr &&
-                                       ((iface->dhcpv4_start_ip.s_addr & iface->dhcpv4_mask.s_addr) !=
-                                        (req->ciaddr.s_addr & iface->dhcpv4_mask.s_addr)))
+                           ((iface->dhcpv4_start_ip.s_addr & iface->dhcpv4_mask.s_addr) !=
+                            (req->ciaddr.s_addr & iface->dhcpv4_mask.s_addr)))
                                req->ciaddr.s_addr = INADDR_ANY;
                }
                break;
@@ -934,10 +939,6 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len,
        reply_opts[reply_opts_len++] = DHCPV4_OPT_AUTHENTICATION;
        reply_opts[reply_opts_len++] = DHCPV4_OPT_SEARCH_DOMAIN;
        reply_opts[reply_opts_len++] = DHCPV4_OPT_FORCERENEW_NONCE_CAPABLE;
-
-       if (a)
-               reply.yiaddr.s_addr = a->addr;
-
        memcpy(&reply_opts[reply_opts_len], req_opts, req_opts_len);
        reply_opts_len += req_opts_len;
 
@@ -1148,6 +1149,11 @@ void dhcpv4_handle_msg(void *src_addr, void *data, size_t len,
                }
        }
 
+       if (a)
+               reply.yiaddr.s_addr = a->addr;
+
+       memcpy(reply.chaddr, req->chaddr, sizeof(reply.chaddr));
+
        dhcpv4_set_dest_addr(iface, reply_msg.data, req, &reply, src_addr, &dest_addr);
 
        /* FIXME: check for DHCPV4_MIN_PACKET_SIZE */